package com.codeyang.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.codeyang.constant.ProdPropConstant;
import com.codeyang.domain.ProdProp;
import com.codeyang.domain.ProdPropValue;
import com.codeyang.mapper.ProdPropMapper;
import com.codeyang.mapper.ProdPropValueMapper;
import com.codeyang.service.ProdPropService;
import com.codeyang.service.ProdPropValueService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 描述: TO-删除标志-DO
 *
 * @author CodeYang_Site
 * @version 2021/5/24 22:34
 */
@CacheConfig(cacheNames = "com.codeyang.service.impl.ProdPropServiceImpl")
@Service
@Slf4j
public class ProdPropServiceImpl extends ServiceImpl<ProdPropMapper, ProdProp> implements ProdPropService {


    @Autowired
    private ProdPropMapper prodPropMapper;

    @Autowired
    private ProdPropValueMapper prodPropValueMapper;

    @Autowired
    private ProdPropValueService prodPropValueService;

    /**
     * 全查询商品属性
     *
     * @return
     */
    @Cacheable(key = ProdPropConstant.PROD_PROP_PREFIX)
    @Override
    public List<ProdProp> list() {
        return prodPropMapper.selectList(null);
    }

    /**
     * 分页查询商品属性规格
     * step_end: 把一个规格(集合)对应 属性'值'集合 设置到 对应的规格对象中去 也就是商品属性的PropId是 这个规格集合中的对应者
     * step:
     * 1.拿到规格集合 Prop 集合
     * 2.拿到Prop 属性|规格集合 ids
     * 3.查询属性值的集合 in ids 精确查询
     * 4.循环 Prop集合 过滤出对应的 PropValues 值集合
     * Prop          :    1         2
     * PropValue     :  34 56    78   89
     * 5.设置到 对应的Prop进去 --可以判空一下
     *
     * @param page
     * @param prodProp
     * @return
     */
    @Override
    public Page<ProdProp> findProdPropPage(Page<ProdProp> page, ProdProp prodProp) {
        //1.
        Page<ProdProp> prodPropPage = prodPropMapper.selectPage(page, new LambdaQueryWrapper<ProdProp>()
                .like(StringUtils.hasText(prodProp.getPropName()), ProdProp::getPropName, prodProp.getPropName())
        );
        //1.1 这里的prodPropList是一个对象引用,我们对其操作 都会生效到 Records 中
        List<ProdProp> prodPropList = prodPropPage.getRecords();
        if (CollectionUtils.isEmpty(prodPropList)) {
            prodPropPage.setRecords(Collections.emptyList());
            prodPropPage.setTotal(0L);
            return prodPropPage;
        }
        //2.
        List<Long> prodPropIds = prodPropList.stream().map(ProdProp::getPropId).collect(Collectors.toList());
        //3.
        List<ProdPropValue> prodPropValueList = prodPropValueMapper.selectList(
                new LambdaQueryWrapper<ProdPropValue>().
                        in(ProdPropValue::getPropId, prodPropIds));  //到这里了肯定是不为空的精确查询了
        //4.
        prodPropList.forEach(item -> {
            //4.1
            List<ProdPropValue> filterPropValues = prodPropValueList.stream()
                    .filter(prodPropValue -> prodPropValue.getPropId().equals(item.getPropId())) //过滤 当前符合条件的筛选values
                    .collect(Collectors.toList()); //收集
            //5.
            item.setProdPropValues(filterPropValues);
        });
        //这里可以省略
        // prodPropPage.setRecords(prodPropList);
        return prodPropPage;
    }


    /**
     * 新增一个商品属性规格对象
     *
     * @param prodProp
     * @return
     */
    @Override
    @Transactional(rollbackFor = RuntimeException.class)
    public boolean save(ProdProp prodProp) {
        log.info("新增属性和属性值{}", JSON.toJSONString(prodProp));
        //设置默认值
        prodProp.setShopId(1L);
        // 参数属性 2
        prodProp.setRule(2);
        int insert = prodPropMapper.insert(prodProp);
        boolean flag = false;
        //这里也要添加到 属性值表中去
        if (insert > 0) {
            //新增属性值表 要得商品的属性规格id
            List<ProdPropValue> prodPropValues = prodProp.getProdPropValues();
            //为这些属性对象 都设置统一的 propId
            prodPropValues.forEach(item -> {
                item.setPropId(prodProp.getPropId());
            });
            boolean b = prodPropValueService.saveBatch(prodPropValues);
            flag = true;
        }
        return flag;
    }


}